package org.huangrui.juc.day04.sync;

import java.util.concurrent.TimeUnit;

/**
 * 1 标准访问，先打印短信还是邮件
 * ------sendSMS
 * ------sendEmail
 *
 * 2 停4秒在短信方法内，先打印短信还是邮件
 * ------sendSMS
 * ------sendEmail
 *
 * 3 新增普通的hello方法，是先打短信还是hello
 * ------getHello
 * ------sendSMS
 *
 * 4 现在有两部手机，先打印短信还是邮件
 * ------sendEmail
 * ------sendSMS
 *
 * 5 两个静态同步方法，1部手机，先打印短信还是邮件
 * ------sendSMS
 * ------sendEmail
 *
 * 6 两个静态同步方法，2部手机，先打印短信还是邮件
 * ------sendSMS
 * ------sendEmail
 *
 * 7 1个静态同步方法,1个普通同步方法，1部手机，先打印短信还是邮件
 * ------sendEmail
 * ------sendSMS
 *
 * 8 1个静态同步方法,1个普通同步方法，2部手机，先打印短信还是邮件
 * ------sendEmail
 * ------sendSMS
 * 线程八锁的关键：
 *  ①非静态方法的锁默认为 this,  静态方法的锁为 对应的 Class 实例
 *  ②某一个时刻内，只能有一个线程持有锁，无论几个方法。
 *
 * synchronized实现同步的基础:java中的每一个对象都可以作为锁,具体表现为以下3种形式。
 *    对于普通同步方法，锁是当前实例对象。
 *    对于静态同步方法，锁是当前类的class对象,
 *    对于同步方法块，锁是synchonized括号里配置的对象
 * @Author hr
 * @Create 2024-03-31 08:08
 */
public class T03_Thread8Lock {
    public static void main(String[] args) {
        Phone phone = new Phone();
        Phone phone2 = new Phone();
        new Thread(() -> {
                phone.sendEmail();
        }, "AA").start();

        try { TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}

        new Thread(() -> {
                 phone.sendSms();
                // phone.getHello();
                // phone2.sendSms();
        }, "BB").start();
    }
}
class Phone {
    public static synchronized void sendEmail() {
        //暂停几秒钟
        try { TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}
        System.out.println("------sendEmail");
    }
    public synchronized void sendSms() {
        System.out.println("------sendSMS");
    }
    public void getHello() {
        System.out.println("------getHello");
    }
}
